package server.aula;

import persistencia.dominio.*;
import java.util.*;

import persistencia.*;
import server.secretaria.aula.ControlCrearAula1;
import utils.UtilsObjetosDominio;
import comun.constantes.*;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */

public class ControlAula {
  protected Persistencia persistencia = null;
  private boolean debug = false;
  private boolean tandaDeSiguientes;
  private boolean tandaDeUltimos;
  private int totalDeContactos = 0;

  public ControlAula(Persistencia persistencia) {
    this.persistencia=persistencia;
  }

public Vector getPersonasResponsablesComision(Long idComision) throws Exception
{
    Vector encargados = this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.RESPONSABLE);
    return encargados;
}


  public Vector getPersonasEncargadoComision(Long idComision) throws Exception
  {
      Vector encargados = this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.TUTOR);
      encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.DOCENTE));
      return encargados;
   
  }


 public Vector getPersonasParticipantesAulaNoAlumnos(Long idAula) throws Exception
    {
  
        Vector encargados = this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.RESPONSABLE,null);
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.ADMINISTRADOR_MATERIALES,null));
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.COLABORADOR,null));
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.COORDINADOR,null));
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.DIRECTOR,null));
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.INVITADO,null));
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.MONITOR_SIAT,null));
        encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.VEEDOR,null));
        return encargados;

  }

 public Vector getPersonasParticipantesComisionNoAlumnos(Long idComision) throws Exception
 {
     Vector encargados = this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.RESPONSABLE);
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.ADMINISTRADOR_MATERIALES));
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.COLABORADOR));
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.COORDINADOR));
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.DIRECTOR));
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.INVITADO));
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.MONITOR_SIAT));
     encargados.addAll(this.getPersonasParticipanteComision(idComision,TIPO_USUARIOS.VEEDOR));
     return encargados;
}
 
  public Vector getPersonasEncargadoAula(Long idAula) throws Exception
  {
      Vector encargados = this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.TUTOR,null);
      encargados.addAll(this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.DOCENTE,null));
      return encargados;

  }



  // Dado el aula y la persona retorna el objeto participante
   public Vector getParticipantes(Long idAula,Long idPersona) throws Exception {
       String filtro=
           "persona.id == "+idPersona+
           " & aula.id == "+idAula;

       Vector participantes = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Participante",filtro);

       /*if (debug)*/   //System.out.println("filtro: "+filtro);
       return participantes; 
   }
    
// Dado el aula y la persona retorna el objeto participante
   public Vector getParticipantesConTipoUsuario(Long idAula,Long idPersona,String tipoUsuario) throws Exception
   {
       String filtro=
           "persona.id == "+idPersona+
           " & aula.id == "+idAula;
       filtro += " & tipoUsuario.nombre == \""+ tipoUsuario+"\"";

       Vector participantes = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Participante",filtro);

       /*if (debug)*/   //System.out.println("filtro: "+filtro);
       return participantes;

   }
   
   // Dado el aula y la persona retorna el objeto participante
    public Vector getParticipantes(Long idAula) throws Exception
    {
        String filtro=
           "aula.id == "+idAula;

        Vector participantes = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Participante","persona.apellido",filtro);

        //if (debug)   System.out.println("filtro: "+filtro);
        return participantes;
    }

//  Dado el aula y la persona retorna el objeto participante
    public Vector getAulas(Long idPersona) throws Exception
    {
        String filtro=
           "persona.id == "+idPersona;
        filtro += " & aula.aulaCompuesta.estadoAula.descripcion == \""+ ESTADO_AULAS.ACTIVO+"\"";
        filtro += " & aula.tipoAula.nombre == \""+ TIPO_AULAS.CURSO+"\"";

        Vector participantes = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Participante","aula.nombre",filtro);
        //if (debug)   System.out.println("filtro: "+filtro);
        return participantes;
    }
    
  // Dado el aula y la persona retorna el objeto participante
   public Participante getParticipante(Long idAula,Long idPersona) throws Exception {
        Vector participantes = this.getParticipantes(idAula,idPersona);
        if(!participantes.isEmpty()) return (Participante)participantes.elementAt(0);
 	   	else return null; 
   }


   /**
    * retiorna las personas que tiene el tipo de usuario "tipoUsuario" en la comision idComision
    * @param idComision
    * @param tipoUsuario si es null recupera todos los participantes
    * @param subStringApellido si es null recupera todos los participantes
    * @return
    * @throws Exception
    */
   public Vector getParticipantesAula(Long idAula, String tipoUsuario) throws Exception
   {
       String filtro = "";
       if (tipoUsuario != null)
         filtro += "tipoUsuario.nombre == \""+ tipoUsuario+"\"";
      filtro += " & aula.id == "+idAula;
      Vector participantes = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Participante","",filtro);
       return participantes;
   }

   public Vector getPersonasParticipanteAula(Long idAula, String tipoUsuario, String subStringApellido) throws Exception
   {

       String filtro = " participantes.contains(participante)";
       if (tipoUsuario != null)
         filtro += " & participante.tipoUsuario.nombre == \""+ tipoUsuario+"\"";
      filtro += " & participante.aula.id == "+idAula;
       if (subStringApellido != null)
         filtro += " & participante.persona.apellido.indexOf(\""+subStringApellido+"\") >=0";
      String vars="Participante participante";
      Vector alumnos = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Persona","apellido",filtro,vars);
       //if (debug)   System.out.println("filtro: "+filtro);
       return alumnos;
   }

   /**
    * retiorna las personas que tiene el tipo de usuario "tipoUsuario" en la comision idComision
    * @param idComision
    * @param tipoUsuario si es null recupera todos los participantes
    * @return
    * @throws Exception
    */
   public Vector getPersonasParticipanteComision(Long idComision, String tipoUsuario) throws Exception
   {
       Comision comision = (Comision)persistencia.getObjectoPorId("persistencia.dominio.Comision",idComision);
       Long idAula = comision.getAulaCompuesta().getId();
       String filtro=
           " participantes.contains(participante)"+
           " & participante.aula.id == "+idAula+
           " & participante.participanteComisiones.contains(participanteComision) ";
       if (tipoUsuario != null)
         filtro += " & participante.tipoUsuario.nombre == \""+ tipoUsuario+"\"";
       filtro += " & participanteComision.comision.id =="+idComision;

       String vars="Participante participante;ParticipanteComision participanteComision";

       Vector alumnos = persistencia.getObjectosPorClaseYFiltro
               ("persistencia.dominio.Persona","apellido",filtro,vars);

       //if (debug)   System.out.println("filtro: "+filtro);

       return alumnos;
   }


 public String getNombreAula(Long idAula,Long idPersona)
 {
  try {
    return this.getParticipante(idAula,idPersona).getAula().getNombre();
  }
  catch (Exception ex) {
//    ex.printStackTrace();
    return "";
  }
 }

//Dado el aula y la persona retorna el objeto participante
 public ParticipanteComision getParticipanteComision(Long idComision,Long idPersona) throws Exception { 
	   Vector participantesComision = this.getParticipantesComision(idComision,idPersona);
	   if(!participantesComision.isEmpty()) return (ParticipanteComision)participantesComision.elementAt(0);
	   else return null; 
 }

//Dado el aula y la persona retorna el objeto participante
 public Vector getParticipantesComision(Long idComision,Long idPersona) throws Exception {
     String filtro=
         "participante.persona.id == "+idPersona+
         " & comision.id == "+idComision;
     
     return persistencia.getObjectosPorClaseYFiltro
             ("persistencia.dominio.ParticipanteComision",filtro); 
 }
 
//Dado el aula y la persona retorna el objeto participante
 public Vector getParticipantesComisionConTipoUsuario(Long idComision,Long idPersona, String tipoUsuario) throws Exception
 {
     String filtro=
         "participante.persona.id == "+idPersona+
         " & comision.id == "+idComision;
     filtro += " & participante.tipoUsuario.nombre == \""+ tipoUsuario+"\"";
     return persistencia.getObjectosPorClaseYFiltro
             ("persistencia.dominio.ParticipanteComision",filtro);
 }

// Dado el aula y la persona retorna la comision del aula en que esta inscripto la Persona
 public Vector getComisionesPersona(Long idAula,Long idPersona) throws Exception
 {
     String filtro=
         "participanteComisiones.contains(participanteComision) "+
         " & participanteComision.participante.persona.id == "+idPersona+
         " & participanteComision.participante.aula.id == "+idAula;

     String vars= "persistencia.dominio.ParticipanteComision participanteComision";
     Vector comisiones = persistencia.getObjectosPorClaseYFiltro
             ("persistencia.dominio.Comision","nombre",filtro,vars);

     return comisiones;

 }

 public boolean comisionSinUsuarios(Long idAula) throws Exception
 {
	 Curso curso = this.getCurso(idAula);
	 ControlCrearAula1 controlCrearAula1 = new ControlCrearAula1(this.persistencia);
	 Vector tiposUsuario = controlCrearAula1.getSoloTiposUsuarioAula(idAula,false,false);
	 TipoUsuario tipoUsuario = null;
	 String filtroTiposUsuario = "("; 
	 for (Iterator d = tiposUsuario.iterator(); d.hasNext();) {
		 tipoUsuario = (TipoUsuario) d.next();
		 filtroTiposUsuario += "participante.tipoUsuario.nombre ==\""+tipoUsuario.getNombre()+"\" |";
	 }
	 //	Saco el ultimo |
	 if (filtroTiposUsuario.length()>2)
		 filtroTiposUsuario = filtroTiposUsuario.substring(0,filtroTiposUsuario.length()-2);
	 filtroTiposUsuario += ")";
	 String filtro = "";
	 
	 Vector comisiones = null;
	 for (Iterator iter = curso.getAulas().iterator(); iter.hasNext();) {
		 Comision comision = (Comision) iter.next();
		 filtro = "comision.id == "+comision.getId()+
         " & "+filtroTiposUsuario;
		 comisiones = persistencia.getObjectosPorClaseYFiltro
             ("persistencia.dominio.ParticipanteComision","",filtro);
		 if(comisiones.isEmpty())
			 return true;
	 }
	 return false;
  }
 
  public Vector getSubAulas(Long idAula) throws Exception
  {
      String filtro = "aulaCompuesta.id == "+idAula;
      //System.out.println("filtro:"+filtro);
      return persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.Aula","nombre",filtro, true);
  }
  
  /*CODIGO AGREGADO POR GRUPO CONDE-PEREYRA - TEMA: GRUPOS*/

  public Vector getParticipantesEncargadoAula(Long idAula)throws Exception{

      Vector encargados = this.getParticipantes(idAula,TIPO_USUARIOS.TUTOR,null);
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.DOCENTE,null));
      return encargados;

  }
  
  public Vector getParticipantesTipoUsuarioAula(Long idAula,String tipoUsuario)throws Exception{
      Vector encargados = this.getParticipantes(idAula,tipoUsuario,null);     
      return encargados;

  }
  
  public Vector getParticipantesAulaNoAlumnosNiWebMaster(Long idAula)throws Exception{
      Vector encargados = this.getParticipantes(idAula,TIPO_USUARIOS.RESPONSABLE,null);
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.ADMINISTRADOR_MATERIALES,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.ADMINISTRADOR,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.COLABORADOR,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.COORDINADOR,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.DIRECTOR,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.INVITADO,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.MONITOR_SIAT,null));
      encargados.addAll(this.getParticipantes(idAula,TIPO_USUARIOS.VEEDOR,null));
      return encargados;   
  }
  
  public Vector getParticipantesComisionNoAlumnosNiWebMaster(Long idComision)throws Exception{
      Vector encargados = this.getParticipantesComision(idComision,TIPO_USUARIOS.RESPONSABLE);
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.ADMINISTRADOR_MATERIALES));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.ADMINISTRADOR));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.COLABORADOR));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.COORDINADOR));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.DIRECTOR));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.INVITADO));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.MONITOR_SIAT));
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.VEEDOR));
      return encargados;
  }
  
  public Vector getParticipantesTipoUsuarioComision(Long idComision,String tipoUSuario)throws Exception{
	   
      Vector encargados = this.getParticipantesComision(idComision,tipoUSuario);      
      return encargados;   
  }
  
  public Vector getParticipantesEncargadoComision(Long idComision)throws Exception{
   
      Vector encargados = this.getParticipantesComision(idComision,TIPO_USUARIOS.TUTOR);
      encargados.addAll(this.getParticipantesComision(idComision,TIPO_USUARIOS.DOCENTE));
      return encargados;   
  }
  
  public Vector getParticipantesComision(Long idComision, String tipoUsuario, int indiceMenor, int indiceMayor) throws Exception{
	  Vector busqueda = this.getParticipantesComision(idComision,tipoUsuario);
	  Vector resultadoContactos = new Vector();
	  //Debo agregar el tratamiento de buscar segun LOS INDICES.
	  int corriente = 0;
      Enumeration enum = busqueda.elements();
      this.totalDeContactos = busqueda.size();
	  //Paso los contactos que no hacen falta
      while (enum.hasMoreElements() & corriente<indiceMenor) {
        enum.nextElement();
        corriente++;
      }
      while (enum.hasMoreElements() & corriente<indiceMayor) {
    	resultadoContactos.addElement((Participante)enum.nextElement());
        corriente++;
      }
      //esto es para saber si se mostro el ultimo contacto
	  //Dejar acentado en el atributo "ultimo" de la clase si lleve todos los contactos o no.
      if (enum.hasMoreElements())
        this.setTandaDeSiguientes(false);
      else
        this.setTandaDeSiguientes(true);
      
//    Dejo acentado si me queda la ultima tanda de "Ultimos" para mostrar
      corriente = 1;
      while (enum.hasMoreElements() & corriente<CONSTANTES_ENTERAS.CANTIDAD_DE_CONTACTOS_PAGINADOS) {
    	  enum.nextElement();
          corriente++;
      }
      if (enum.hasMoreElements())
          this.setTandaDeUltimos(false);
        else
          this.setTandaDeUltimos(true); 
      return resultadoContactos;
  }
  
  public Vector getParticipantesComision(Long idComision, String tipoUsuario) throws Exception{
	      String filtro=
	          " participanteComisiones.contains(participanteComision)"+
	          " & participanteComision.comision.id == "+idComision +
	          " & persona != null "+
	          " & tipoUsuario.nombre == \""+ tipoUsuario+"\"";
	      String vars="ParticipanteComision participanteComision";
	      Vector participantes = persistencia.getObjectosPorClaseYFiltro
	              ("persistencia.dominio.Participante","persona.apellido",filtro,vars);
	      return participantes;	   
  }
  
  public Vector getParticipantes(Long idAula, String tipoUsuario, String opcion, int indiceMenor, int indiceMayor) throws Exception{
	  Vector busqueda = this.getParticipantes(idAula,tipoUsuario,null);
	  Vector resultadoContactos = new Vector();
	  //Debo agregar el tratamiento de buscar segun LOS INDICES.
	  int corriente = 0;
      Enumeration enum = busqueda.elements();
      this.totalDeContactos = busqueda.size();
	  //Paso los contactos que no hacen falta
      while (enum.hasMoreElements() & corriente<indiceMenor) {
        enum.nextElement();
        corriente++;
      }
      while (enum.hasMoreElements() & corriente<indiceMayor) {
    	resultadoContactos.addElement((Participante)enum.nextElement());
        corriente++;
      }
      //esto es para saber si se mostro el ultimo contacto
	  //Dejar acentado en el atributo "ultimo" de la clase si lleve todos los contactos o no.
      if (enum.hasMoreElements())
        this.setTandaDeSiguientes(false);
      else
        this.setTandaDeSiguientes(true);

      //Dejo acentado si me queda la ultima tanda de "Ultimos" para mostrar
      corriente = 1;
      while (enum.hasMoreElements() & corriente<CONSTANTES_ENTERAS.CANTIDAD_DE_CONTACTOS_PAGINADOS) {
    	  enum.nextElement();
          corriente++;
      }
      if (enum.hasMoreElements())
          this.setTandaDeUltimos(false);
        else
          this.setTandaDeUltimos(true);   
      return resultadoContactos;
  } 
  
  public Vector getParticipantes(Long idAula, String tipoUsuario, String opcion) throws Exception{
      String filtro=
         "aula.id == "+idAula +
      	" & tipoUsuario.nombre == \""+ tipoUsuario+"\"";
     String ordenarPor = "persona.apellido";
     if(opcion!=null){
	     if(opcion.compareTo(OPCION_AUTOCOMPLETADO.AL_AZAR)==0)
	   		ordenarPor = "persona.calle";
	   	 else if(opcion.compareTo(OPCION_AUTOCOMPLETADO.ALFABETICAMENTE)==0)
	 		  	ordenarPor = "persona.apellido";
	 	 else if(opcion.compareTo(OPCION_AUTOCOMPLETADO.GEOGRAFICAMENTE)==0)
	 		  ordenarPor = "persona.ciudad.nombre";
	 	 else if(opcion.compareTo(OPCION_AUTOCOMPLETADO.EDADES)==0)
	 		  ordenarPor = "persona.fechaNacimiento";
     }
 	 Vector participantes = persistencia.getObjectosPorClaseYFiltro
             ("persistencia.dominio.Participante",ordenarPor,filtro);
      return participantes;
  }
  
  public Vector getComisionesDelAula(Long idAula) throws Exception{
 	     /*String filtro=
 	         "participanteComisiones.contains(participanteComision) "+
 	         " & participanteComision.participante.aula.id == "+idAula;
 	     String vars= "persistencia.dominio.ParticipanteComision participanteComision";
 	     Vector grupos = persistencia.getObjectosPorClaseYFiltro
 	             ("persistencia.dominio.Comision","nombre",filtro,vars);*/

 	     String filtro=  "aulaCompuesta.id == "+idAula;
	     Vector comisiones = persistencia.getObjectosPorClaseYFiltro
	             ("persistencia.dominio.Comision","nombre",filtro);
 	     
 	     return comisiones;
  }  

  public Vector getTiposUsuarioEnElNivel(String nivel)throws Exception{
  		String filtro=
 	           " tipoUsuariosEnNivel.contains(tipoUsuarioNivel)"+
 	           " & tipoUsuarioNivel.tipoAula.nombre == \""+nivel+"\"";
  		String vars="persistencia.dominio.TipoUsuarioEnNivel tipoUsuarioNivel";
 	        return persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.TipoUsuario","",filtro,vars);

  }
  
  public Vector getParticipantesWebMasters() throws Exception{
   	  String filtro=
	   		  	" participantes.contains(participante)"+
	            " & participante.tipoUsuario.nombre == \""+ TIPO_USUARIOS.WEBMASTER+"\"";
	   	String vars="persistencia.dominio.Participante participante";
	    Vector participantes = persistencia.getObjectosPorClaseYFiltro
	                ("persistencia.dominio.Persona","apellido",filtro,vars);

	      return participantes;
	  }
  
  public Vector getPersonasDesarrolladores() throws Exception{
   	  String filtro=
	   		  	"desarrollador == "+true;
	   	Vector desarooladores = persistencia.getObjectosPorClaseYFiltro
	                ("persistencia.dominio.Persona","apellido",filtro);
	      return desarooladores;
	  }

  /*HASTA ACA*/ 
  
  public void setTandaDeSiguientes(boolean ultimo) {
    this.tandaDeSiguientes = ultimo;
  }
  public boolean isTandaDeSiguientes() {
    return tandaDeSiguientes;
  }

public boolean isTandaDeUltimos() {
	return tandaDeUltimos;
}

public void setTandaDeUltimos(boolean tandaDeUltimos) {
	this.tandaDeUltimos = tandaDeUltimos;
}

public int getTotalDeContactos() {
	return totalDeContactos;
}

public void setTotalDeContactos(int totalDeContactos) {
	this.totalDeContactos = totalDeContactos;
}  

public Curso getCurso(Long idCurso) throws Exception{
    return (Curso)persistencia.getObjectoPorId("persistencia.dominio.Curso",idCurso);
}

public Comision getComision(Long idComision) throws Exception{
    return (Comision)persistencia.getObjectoPorId("persistencia.dominio.Comision",idComision);

}

public Vector getAulasDondeParticipaMenosComoAlumnos(Long idPersona) throws Exception{
		String filtro =
			" participantes.contains(participante)"+
			" & participante.persona.id =="+idPersona+
			" & participante.tipoUsuario.nombre != \""+ TIPO_USUARIOS.ALUMNO+"\""+
			" & (estadoAula.descripcion == \""+ESTADO_AULAS.ACTIVO +"\" "+
	        "   | estadoAula.descripcion == \""+ESTADO_AULAS.FINALIZADO+"\")";
			//" & participante.tipoUsuario.nombre != \""+ TIPO_USUARIOS.WEBMASTER+"\"";//Ver si dejamos
		
		String vars="persistencia.dominio.Participante participante";
		System.out.println("filtro:"+filtro);
		return persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.Curso","nombre",filtro,vars);

}

public Vector getPersonasResponsablesDelAula(Long idAula) throws Exception{
    Vector encargados = this.getPersonasParticipanteAula(idAula,TIPO_USUARIOS.RESPONSABLE,null);
    return encargados;

}

public Hashtable getParticipantesDelAula(Long idAula,boolean incluirAlumnos, boolean incluirWM) throws Exception{
	Hashtable hashtable = new Hashtable();
		Vector encargados = new Vector();
		Vector participantes = new Vector();
		Vector tiposUsuarios = new Vector();
		
		/*
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.RESPONSABLE,null);
		if(!participantes.isEmpty()){
			encargados = participantes;
			tiposUsuarios.add(TIPO_USUARIOS.RESPONSABLE);
		}*/
		
		/*participantes = this.getParticipantes(idAula,TIPO_USUARIOS.ADMINISTRADOR,null);
		if(!participantes.isEmpty()){
			encargados = participantes;
			tiposUsuarios.add(TIPO_USUARIOS.ADMINISTRADOR);
		}*/

		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.ADMINISTRADOR_MATERIALES,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.ADMINISTRADOR_MATERIALES);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.COLABORADOR,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.COLABORADOR);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.COORDINADOR,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.COORDINADOR);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.DIRECTOR,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.DIRECTOR);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.INVITADO,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.INVITADO);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.MONITOR_SIAT,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.MONITOR_SIAT);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.VEEDOR,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.VEEDOR);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.DOCENTE,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.DOCENTE);
		}
		
		participantes = this.getParticipantes(idAula,TIPO_USUARIOS.TUTOR,null);
		if(!participantes.isEmpty()){
			encargados.addAll(participantes);
			tiposUsuarios.add(TIPO_USUARIOS.TUTOR);
		}
		
		hashtable.put("Participantes",encargados);
		hashtable.put("TipoUsuarios",tiposUsuarios);
		
		return hashtable;
}

public Vector getParticipantes(Long idAula, String[] tiposUsuario, String opcion) throws Exception{
		String filtro = "aula.id == "+idAula;
		
		String filtroUsuarios = " & (";
		boolean agregoTipoUsuario = false;
		for(int i = 0; i < tiposUsuario.length; i++){
			String usuario = tiposUsuario[i];
			filtroUsuarios += " tipoUsuario.nombre == \""+usuario+"\" |";
			agregoTipoUsuario = true;
		}
		if(agregoTipoUsuario){
			filtroUsuarios = filtroUsuarios.substring(0,filtroUsuarios.length()-1);// le saco el ultimo or
			filtroUsuarios += " )";
			filtro += filtroUsuarios;
		}
		
		String ordenarPor = "persona.apellido";
		if(opcion!=null){
			if(opcion.compareTo(OPCION_AUTOCOMPLETADO.AL_AZAR)==0)
				ordenarPor = "persona.calle";
			else if(opcion.compareTo(OPCION_AUTOCOMPLETADO.ALFABETICAMENTE)==0)
				ordenarPor = "persona.apellido";
			else if(opcion.compareTo(OPCION_AUTOCOMPLETADO.GEOGRAFICAMENTE)==0)
				ordenarPor = "persona.ciudad.nombre";
			else if(opcion.compareTo(OPCION_AUTOCOMPLETADO.EDADES)==0)
				ordenarPor = "persona.fechaNacimiento";
		}
		Vector participantes = persistencia.getObjectosPorClaseYFiltro
											("persistencia.dominio.Participante",ordenarPor,filtro);
		return participantes;
}

//Dado el aula y la persona retorna el objeto participante
public Vector getParticipantes(Long idAula,Long idPersona, String tipoUsuario) throws Exception
{
    String filtro =
        "persona.id == "+idPersona+
        " & aula.id == "+idAula+
        " & tipoUsuario.nombre == \""+tipoUsuario+"\"";

    Vector participantes = persistencia.getObjectosPorClaseYFiltro
            ("persistencia.dominio.Participante",filtro);

    return participantes;

 
}


public Persona getPersona(Long idPersona)throws Exception{
		  return (Persona)persistencia.getObjectoPorId("persistencia.dominio.Persona",idPersona);
}

public Vector recursosUtilizadosEnElAula(Long idAula) throws Exception{
		//Diferenciar para el caso del Pizarron, ya que es usado a nivel Comision. Necesitamos el idComision.
		Vector comisiones = this.getComisionesDelAula(idAula);
		String filtro = "";
		String filtroSinPizarron = "(";
		String filtroParaPizarron = "";
		for (int i = 0; i < RECURSOS.LISTA_DE_RECURSOS_POSIBLES_DE_UTILIZAR_PARA_SOLICITUDES.length; i++) {
			if(RECURSOS.LISTA_DE_RECURSOS_POSIBLES_DE_UTILIZAR_PARA_SOLICITUDES[i].compareTo(RECURSOS.PIZARRON)!=0)
				filtroSinPizarron += "recurso.nombre ==\""+RECURSOS.LISTA_DE_RECURSOS_POSIBLES_DE_UTILIZAR_PARA_SOLICITUDES[i]+"\" |";
		}		
		//Saco el ultimo |
		if (filtroSinPizarron.length()>2)
		     filtroSinPizarron = filtroSinPizarron.substring(0,filtroSinPizarron.length()-2);
		filtroSinPizarron += ") & (aula.id == "+idAula+" || aula.id == "+((Comision)comisiones.elementAt(0)).getId()+")";
		filtroSinPizarron = "("+filtroSinPizarron+")";
		
		//En caso de consultar por el Pizarron, el id que se debe pasar debe ser de una Comision
		filtroParaPizarron += "(recurso.nombre ==\""+RECURSOS.PIZARRON+"\" & aula.id == "+((Comision)comisiones.elementAt(0)).getId()+")";
		
		//A todos los tipos de usuarios le anularemos el permiso, menos al WebMaster
		
		Vector participantes = this.getParticipantes(idAula);
		Participante participante = null;
		String filtroAulaTipoUsuario = "("; 
		for (Iterator d = participantes.iterator(); d.hasNext();) {
			participante = (Participante) d.next();
			if(participante.getTipoUsuario().getNombre().compareTo(TIPO_USUARIOS.WEBMASTER)!=0){
				filtroAulaTipoUsuario += "tipoUsuario.nombre ==\""+participante.getTipoUsuario().getNombre()+"\" |";
			}
		}
		//Saco el ultimo |
		if (filtroAulaTipoUsuario.length()>2)
			filtroAulaTipoUsuario = filtroAulaTipoUsuario.substring(0,filtroAulaTipoUsuario.length()-2);
		filtroAulaTipoUsuario += ")";                
		filtro = "("+filtroSinPizarron+" | "+filtroParaPizarron+") & "+filtroAulaTipoUsuario; 
		filtro += " & tipoPermiso.descripcion !=\""+TIPO_PERMISOS.NINGUNO+"\"" ;
					
		//En esta consulta me traeran muchos objetos PermisoAcceso en los cuales se repetiran los Recursos (uno para 
		//cada TipoDeUsuario). 
		Vector permisosAccesos = persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.PermisoAcceso",filtro);
		Vector recursosUtilizados = new Vector();
		for (Iterator i = permisosAccesos.iterator(); i.hasNext();) {
			PermisoAcceso permisoAcceso = (PermisoAcceso) i.next();
			if(permisoAcceso.getTipoPermiso().getDescripcion().compareTo(TIPO_PERMISOS.NINGUNO)!=0)
				UtilsObjetosDominio.agregarObjetoAVector(permisoAcceso.getRecurso(),recursosUtilizados);
		}
		Vector nombresDeRecursosUtilizados = new Vector();
		for (Iterator iter = recursosUtilizados.iterator(); iter.hasNext();) {
			Recurso rec = (Recurso) iter.next();
			nombresDeRecursosUtilizados.add(rec.getNombre());	
		}
		//Retornaremos un vector con los Nombres de los Recursos Utilizados. En la Interfaz de Solicitud Aula, 
		//vamos invocando el metodo "ManejoString.estaObjetoEnVector(RESULTADO DE ESTE METODO, RECURSO CORRIENTE)".
		//Recurso que este en este vector => va el SI, caso contrario el NO.
		return nombresDeRecursosUtilizados;
}

public Vector getDocentesSolicitudAulaOrdenadas(Long idSolicitudAula) throws Exception{
		String filtro = "solicitudAula.id == "+idSolicitudAula;
		String ordenarPor = "docenteSolicitado.apellido";
		Vector participantes = persistencia.getObjectosPorClaseYFiltro
											("persistencia.dominio.SolicitudDocenteAula",ordenarPor,filtro);
		return participantes;
}

public Vector alertaAlumnosSinComision(Long idAula) throws Exception{
    Vector participantes = this.getParticipantes(idAula,TIPO_USUARIOS.ALUMNO,null);
    Vector resul = new Vector();
    for (Iterator iter = participantes.iterator(); iter.hasNext();) {
		Participante participante = (Participante) iter.next();
		if(participante.getParticipanteComisiones()==null || participante.getParticipanteComisiones().size()==0)
			resul.add(participante);
	}    
	return resul;
}
}